package org.skywork.dal.basic;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : SkyWork Data Access Layer
// Archivo : EmpresaDAO.java
// Descripcion : Clase EmpresaDAO
// *************************************************************************/
// Version : 2.11.8
// Fecha de Creación: 31 de Diciembre de 2014
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.skywork.dal.SkyWorkDAO;
import org.skywork.entitys.basic.Empresa;
import org.sql.commands.exception.DMLException;
import org.sql.commands.mysql.clause.Where;
import org.sql.commands.mysql.command.Insert;
import org.sql.commands.mysql.command.Select;
import org.sql.commands.mysql.filter.Condition;

public class EmpresaDAO extends SkyWorkDAO <Empresa> {
    
    // Atributos estáticos de la clase PersonaDAO
    
    private static final String COMMAND_POR_NIT = "COMANDO POR NIT";
    
    // Atributos de la clase EmpresaDAO
    
    private final String NAME_TABLE = "EMPRESA";
    private final int NUMBER_COLUMNS = 8;
    
    // Nombre de Columnas de la tabla Persona en Base de Datos
    
    public static final String NIT = "NIT";
    public static final String NOMBRE = "NOMBRE";
    public static final String DIRECCION = "DIRECCION";
    public static final String BARRIO = "BARRIO";
    public static final String CIUDAD = "CIUDAD";
    public static final String TELEFONO = "TELEFONO";
    public static final String CELULAR = "CELULAR";
    public static final String CORREO = "CORREO";
    
    // Metodos de la clase EmpresaDAO
    
    /**
     * Este metodo nos permite ejecutar el registro de una Empresa en la Base de 
     * Datos del Sistema. Donde la persona se establece con un objeto <code>Empresa</code>.
     * 
     * @param empresa Objeto que contiene los datos de la Empresa
     * @return Retorna el resultado del proceso en un dato <code>boolean</code>.
     * @throws SQLException Se lanzara esta excepción cuando ocurra errores SQL.
     * @throws DMLException Se lanzara esta excepción cuando ocurra errores DML.
     */
    public static boolean registrar(Empresa empresa) throws SQLException, DMLException {
        return new EmpresaDAO().insert(empresa);
    }
    
    /**
     * Este método nos permite ejecutar la busqueda de la Empresa en la Base
     * de Datos de Sistema atraves de su NIT. Donde el NIT para realizar consulta se
     * establece con un objeto <code>String</code>.
     * 
     * @param nit NIT para identificar Empresa en el Sistema
     * @return Retorna la empresa en un objeto <code>Empresa</code>.
     * @throws SQLException Se lanzara esta excepción cuando ocurra errores SQL.
     * @throws DMLException Se lanzara esta excepción cuando ocurra errores DML.
     */
    public static Empresa buscarPorNIT(String nit) throws SQLException, DMLException {
        TIPO_COMANDO = COMMAND_POR_NIT; // Tipo de Comando
        return new EmpresaDAO().selectUnique(nit);
    }
    
    // Metodos sobreescritos de la clase EmpresaDAO

    @Override
    protected ArrayList generateDataInsert(Empresa object) {
        // Instanciando Array para contener los datos 
        ArrayList entidadDatos = new ArrayList();
        
        // Cargando datos a insertar en el Array
        entidadDatos.add(object.getIdentificacion());
        entidadDatos.add(object.getNombreEntidad());
        entidadDatos.add(object.getDireccion());
        entidadDatos.add(object.getBarrio());
        entidadDatos.add(object.getCiudad());
        entidadDatos.add(object.getTelefono());
        entidadDatos.add(object.getCelular());
        entidadDatos.add(object.getCorreo());
        
        return entidadDatos; // Datos para Insertar
    }

    @Override
    protected Insert generateInsert() {
        return Insert.creatorCommand(NAME_TABLE,NUMBER_COLUMNS);
    }

    @Override
    protected Select generateSelect() {
        Select select = new Select(); // Creando sentencia de Busqueda
        
        switch (TIPO_COMANDO) {
            // Busqueda de Arrendatario por Cédula en el Sistema
            case (COMMAND_POR_NIT) :
                select.addColumn("*"); select.addTable(NAME_TABLE); 
                
                WHERE = new Where(); // Clausula del Comando
                WHERE.addFilter(Condition.creatorFilter(NIT + " = ?"));
                select.addClause(WHERE); // Agregando clausula al Comando
            break;
        } // Definiendo el tipo de Sentencia para realizar Busqueda
        
        return select; // Retornando Comando de Selección
    }

    @Override
    protected Empresa generateObject(ResultSet result) throws SQLException {
        // Instanciando objeto a contener Empresa
        Empresa empresa = new Empresa(result.getString(NIT));
        
        // Cargando información de la Empresa en el objeto
        empresa.setNombre(result.getString(NOMBRE));
        empresa.setDireccion(result.getString(DIRECCION));
        empresa.setBarrio(result.getString(BARRIO));
        empresa.setCiudad(result.getString(CIUDAD));
        empresa.setTelefono(result.getString(TELEFONO));
        empresa.setCelular(result.getString(CELULAR));
        empresa.setCorreo(result.getString(CORREO));
        
        return empresa; // Retornando empresa del Sistema
    }
}